home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 35 / 35.xpi / chrome / ieview.jar / content / ieviewOverlay.js < prev    next >
Text File  |  2009-09-17  |  28KB  |  1,400 lines

  1. /*
  2.  *
  3.  * Copyright (c) 2003-2008  Paul Roub <paul@roub.net>
  4.  *
  5.  * Portions based on GPLed code by
  6.  *     Ted Mielczarek
  7.  *
  8.  * This library is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU Lesser General Public
  10.  * License as published by the Free Software Foundation; either
  11.  * version 2.1 of the License, or (at your option) any later version.
  12.  *
  13.  * This library is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.  * Lesser General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU Lesser General Public
  19.  * License along with this library; if not, write to the Free Software
  20.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  21.  *
  22.  * *****
  23.  *
  24.  * Notes:
  25.  *
  26.  *    Since we can't know ahead of time where IE will be installed, we Kiboze the
  27.  *    Start Menu tree.  If the shortcut has been renamed (i.e. it is no longer
  28.  *    titled "Internet Explorer"), we're out of luck.  The only option at that
  29.  *    point would be to open and dereference every symlink we find, and see if the
  30.  *    target leaf name is "iexplore.exe".  Not doing that at the moment, since
  31.  *    it just seems insane.
  32.  */
  33.  
  34. var    gIeViewBundle;
  35.  
  36. function ieviewAlert(msg)
  37. {
  38.     // alert(msg);
  39. }
  40.  
  41. var IeView = {
  42.  
  43.     ieviewMenuItems: new Array("ieview-do-view", "ieview-do-forcepage"),
  44.     ieviewLinkMenuItems: new Array("ieview-do-viewlink", "ieview-do-forcelink", "ieview-do-forcelink-menu"),
  45.     userPrograms: "Progs",
  46.     allUserPrograms: "CmPrgs",
  47.     applicationData: "AppData",
  48.  
  49.     isJsLink: function(href)
  50.     {
  51.         return(! this.isForceable(href));
  52.     },
  53.  
  54.     enableForceIE: function()
  55.     {
  56.         var    enabled = true;
  57.  
  58.         if (this.getBoolPref("ieview.disableForce", false))
  59.         {
  60.             enabled = false;
  61.         }
  62.  
  63.         return(enabled);
  64.     },
  65.  
  66.     closeAfterRedirect: function()
  67.     {
  68.         var    closeAfter = this.getBoolPref("ieview.closeReloadPage", false);
  69.  
  70.         return(closeAfter);
  71.     },
  72.  
  73.     placesContext: function(evt)
  74.     {
  75.         var menuitem = document.getElementById('ieview-do-places-view');
  76.  
  77.         if (menuitem)
  78.         {
  79.             var showitem = false;
  80.  
  81.             if (document.popupNode && document.popupNode.node && document.popupNode.node.uri)
  82.             {
  83.                 showitem = this.isForceable(document.popupNode.node.uri);
  84.             }
  85.  
  86.             menuitem.hidden = ! showitem;
  87.         }
  88.  
  89.         return(true);
  90.     },
  91.  
  92.     tabContextShowing: function(evt)
  93.     {
  94.         var menuitem = document.getElementById('context-ieViewTab');
  95.  
  96.         if (menuitem)
  97.         {
  98.             var showitem = false;
  99.  
  100.             var href = this.getTabUrl();
  101.  
  102.             showitem = href && this.isForceable(href);
  103.  
  104.             menuitem.hidden = ! showitem;
  105.             
  106.             var sep = document.getElementById('context-ieViewTabsep');
  107.             sep.hidden = ! showitem;
  108.         }
  109.  
  110.         return(true);
  111.     },
  112.  
  113.  
  114.  
  115.     ieviewContext: function()
  116.     {
  117.         if (gContextMenu)
  118.         {
  119.             var i;
  120.             var menuitem = null;
  121.  
  122.             for ( i=0; i < this.ieviewMenuItems.length; i++)
  123.             {
  124.                 menuitem = document.getElementById(this.ieviewMenuItems[i]);
  125.  
  126.                 if (menuitem)      // click-on-page item
  127.                 {
  128.                     menuitem.hidden = (gContextMenu.isTextSelected || gContextMenu.onLink || gContextMenu.onImage || gContextMenu.onTextInput ) ||
  129.                 ((! this.enableForceIE()) && (this.ieviewMenuItems[i].indexOf("force") >= 0));
  130.                 }
  131.             }
  132.  
  133.             for ( i = 0; i < this.ieviewLinkMenuItems.length; ++i )
  134.             {
  135.                 menuitem = document.getElementById(this.ieviewLinkMenuItems[i]);
  136.  
  137.                 if (menuitem)      // click-on-link item
  138.                 {
  139.                     menuitem.hidden = (! gContextMenu.onLink)  || // no link, no link item
  140.                                         ((! this.enableForceIE()) && (this.ieviewMenuItems[i].indexOf("force") >= 0));
  141.  
  142.                     // disable the link if it's javascript
  143.                     //
  144.                     var disable = ((! menuitem.hidden) && this.isJsLink(this.contextLinkURL()));
  145.  
  146.                     if (disable)
  147.                         menuitem.setAttribute('disabled', 'true');
  148.                     else
  149.                         menuitem.setAttribute('disabled', 'false');
  150.                 }
  151.             }
  152.         }
  153.     },
  154.  
  155.     placesView: function()
  156.     {
  157.         var n = document.popupNode;
  158.  
  159.         if (n && n.node && n.node.uri)
  160.         {
  161.             this.ieViewLaunch("Internet Explorer.lnk", n.node.uri);
  162.         }
  163.  
  164.     },
  165.  
  166.  
  167.     ieView: function()
  168.     {
  169.         var href = gBrowser.currentURI.spec;
  170.     
  171.         this.ieViewLaunch("Internet Explorer.lnk", href);
  172.     },
  173.  
  174.  
  175.     ieViewLink: function()
  176.     {
  177.         if (gContextMenu)
  178.         {
  179.             var href = this.contextLinkURL();
  180.  
  181.             this.ieViewLaunch("Internet Explorer.lnk", href);
  182.         }
  183.     },
  184.  
  185.     // grab the link URL (if any) from the context menu, accounting for changes
  186.     // between FF 1.0 and 1.5
  187.     //
  188.     contextLinkURL: function()
  189.     {
  190.           if (gContextMenu && gContextMenu.getLinkURL)
  191.         {
  192.             return(gContextMenu.getLinkURL());
  193.         }
  194.         else if (gContextMenu && gContextMenu.linkURL)
  195.         {
  196.             return(gContextMenu.linkURL());
  197.         }
  198.     
  199.         return(false);
  200.     },
  201.  
  202.     saveIeLoc: function(path)
  203.     {
  204.             var prefService = Components.classes["@mozilla.org/preferences-service;1"]
  205.                                         .getService(Components.interfaces.nsIPrefService);
  206.  
  207.             var prefs = prefService.getBranch("");
  208.  
  209.             prefs.setCharPref("ieview.ieapp", path);
  210.     },
  211.  
  212.     confirmAdd: function(href)
  213.     {
  214.         var alwaysMessage = "Will always use IE to open URLs beginning with";
  215.  
  216.         try
  217.         {
  218.             alwaysMessage = gIeViewBundle.getString("ieview.alwaysopenwith");
  219.         }
  220.         catch(e)
  221.         {
  222.             alert(e);
  223.             return(false);
  224.         }
  225.  
  226.         alwaysMessage += " " + href;
  227.  
  228.         return( confirm(alwaysMessage) );
  229.     },
  230.  
  231.     addForce: function(href)
  232.     {
  233.         var root = href;
  234.         var root2 = false;
  235.  
  236.         var cls = Components.classes["@mozilla.org/network/io-service;1"];
  237.         var srv = cls.getService(Components.interfaces.nsIIOService);
  238.  
  239.         var uri = false;
  240.  
  241.         try
  242.         {
  243.             uri = srv.newURI(href, null, null);
  244.         }
  245.         catch(e)
  246.         {
  247.             uri = false;
  248.         }
  249.     
  250.         if (uri && (uri.username || uri.userPass))
  251.         {
  252.             uri.username = '';
  253.             uri.userPass = '';
  254.         }
  255.  
  256.         if (uri && uri.prePath)
  257.         {
  258.             root = uri.prePath;
  259.         }
  260.     
  261.         if (uri)
  262.         {
  263.             if (uri.scheme == 'http')
  264.             {
  265.                 uri.scheme = 'https';
  266.                 root2 = uri.prePath;
  267.             }
  268.             else if (uri.scheme == 'https')
  269.             {
  270.                 uri.scheme = 'http';
  271.                 root2 = uri.prePath;
  272.             }
  273.         }
  274.  
  275.         if (! this.confirmAdd(root))
  276.         {
  277.             return(false);
  278.         }
  279.  
  280.         var forces = this.getForceList();
  281.         forces[forces.length] = root;
  282.         
  283.         if (root2)
  284.         {
  285.             forces[forces.length] = root2;
  286.         }
  287.         
  288.         var forceStr = forces.join(" ");
  289.  
  290.         var prefService = Components.classes["@mozilla.org/preferences-service;1"]
  291.                                     .getService(Components.interfaces.nsIPrefService);
  292.  
  293.         var prefs = prefService.getBranch("");
  294.  
  295.         prefs.setCharPref("ieview.forceielist", forceStr);
  296.  
  297.         return(true);
  298.     },
  299.  
  300.  
  301.     forceLink: function()
  302.     {
  303.         if (! gContextMenu)
  304.         {
  305.             return;
  306.         }
  307.  
  308.         this.addForce(gContextMenu.linkURL());
  309.         this.ieViewLink();
  310.     },
  311.  
  312.     forcePage: function()
  313.     {
  314.         if (this.addForce(gBrowser.currentURI.spec))
  315.         {
  316.             this.ieView();
  317.         }
  318.     },
  319.  
  320.  
  321.     // attempt to grab the real path of a predefined directory
  322.     //
  323.     tryDir: function(dsp, key)
  324.     {
  325.         try
  326.         {
  327.             var nif = dsp.get(key, Components.interfaces.nsIFile);
  328.             return(nif.path);
  329.         }
  330.         catch (ar)
  331.         {
  332.             return("");
  333.         }
  334.     },
  335.  
  336.  
  337.     searchPath: function(path, fname)
  338.     {
  339.         var result = null;
  340.  
  341.         try
  342.         {
  343.             var f = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
  344.  
  345.             f.initWithPath(path);
  346.  
  347.             if (f.exists() && f.isDirectory())
  348.             {
  349.                 var entries = f.directoryEntries;
  350.  
  351.                 while (entries.hasMoreElements())
  352.                 {
  353.                     var ent = entries.getNext().QueryInterface(Components.interfaces.nsIFile);
  354.  
  355.                     if (ent.isDirectory())
  356.                     {
  357.                         result = this.searchPath(ent.path, fname);
  358.  
  359.                         if (result)
  360.                         {
  361.                             break;
  362.                         }
  363.                     }
  364.                     else if (ent.isSymlink())
  365.                     {
  366.                         if (ent.leafName.toLowerCase() == fname.toLowerCase())
  367.                         {
  368.                             result = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
  369.                             result.followLinks = true;
  370.                             result.initWithPath(ent.path);
  371.  
  372.                             if (result.target == "")
  373.                             {
  374.                                 result = null;
  375.                             }
  376.                             else
  377.                             {
  378.                                 break;
  379.                             }
  380.                         }
  381.                     }
  382.                     else if (ent.isFile())
  383.                     {
  384.                         if (ent.leafName.toLowerCase() == fname.toLowerCase())
  385.                         {
  386.                             result = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
  387.                             result.initWithPath(ent.path);
  388.                             break;
  389.                         }
  390.                     }
  391.                 }
  392.             }
  393.         }
  394.         catch (ar)
  395.         {
  396.             return(null);
  397.         }
  398.  
  399.         return( result );
  400.     },
  401.  
  402.  
  403.     ievtrim: function(st)
  404.     {
  405.         var result = st.replace( /^\s+/g, "" );
  406.         result = result.replace( /\s+$/g, "" );
  407.         return(result);
  408.     },
  409.  
  410.  
  411.     deQuote: function(st)
  412.     {
  413.         var result = this.ievtrim(st);
  414.  
  415.         if ((result.length >= 2) &&
  416.             (result.charAt(0) == '"') &&
  417.             (result.charAt(result.length - 1) == '"')
  418.             )
  419.         {
  420.             result = this.ievtrim(result.substr(1, result.length - 2));
  421.         }
  422.  
  423.         return(result);
  424.     },
  425.  
  426.     expandEnv: function(st) 
  427.     {
  428.     var result = st;
  429.  
  430.     var env = Components.classes['@mozilla.org/process/environment;1'].createInstance(Components.interfaces.nsIEnvironment);
  431.  
  432.     var reg = /^(.*?)%([^%]+)%(.*)$/;
  433.  
  434.     while (reg.test(result))
  435.     {
  436.         var matches = reg.exec(result);
  437.  
  438.         result = matches[1] + env.get(matches[2]) + matches[3];
  439.  
  440.     }
  441.  
  442.     return(result);
  443.     },
  444.  
  445.     parseArgs: function(argstring)
  446.     {
  447.         var res = new Array();
  448.         var remain = this.ievtrim(argstring);
  449.  
  450.         while (remain != "")
  451.         {
  452.             var chunk = "";
  453.  
  454.             var i = 0;
  455.  
  456.             var inQuote = false;
  457.  
  458.             while (i < remain.length)
  459.             {
  460.                 if (inQuote)
  461.                 {
  462.                     if (remain[i] == '"')
  463.                     {
  464.                             chunk += remain[i];
  465.                             ++i;
  466.                             break;
  467.                     }
  468.                     else
  469.                     {
  470.                             chunk += remain[i];
  471.                             ++i;
  472.                     }
  473.                 }
  474.                 else
  475.                 {
  476.                     if (remain[i] == '"')
  477.                     {
  478.                             chunk += remain[i];
  479.                             inQuote = true;
  480.                             ++i;
  481.                     }
  482.                     else if (remain[i] == ' ')
  483.                     {
  484.                             break;
  485.                     }
  486.                     else
  487.                     {
  488.                             chunk += remain[i];
  489.                             ++i;
  490.                     }
  491.                 }
  492.  
  493.             }
  494.  
  495.             remain = this.ievtrim(remain.substring(i));
  496.  
  497.             res.push(chunk);
  498.         }
  499.  
  500.         return(res);
  501.     },
  502.  
  503.     getCharPref: function(prefName, defval)
  504.     {
  505.         var    result = defval;
  506.  
  507.         var prefservice = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
  508.         var prefs = prefservice.getBranch("");
  509.  
  510.         if (prefs.getPrefType(prefName) == prefs.PREF_STRING)
  511.         {
  512.             result = prefs.getCharPref(prefName);
  513.         }
  514.  
  515.         return(result);
  516.     },
  517.  
  518.     getBoolPref: function(prefName, defval)
  519.     {
  520.         var    result = defval;
  521.  
  522.         var prefservice = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
  523.         var prefs = prefservice.getBranch("");
  524.  
  525.         if (prefs.getPrefType(prefName) == prefs.PREF_BOOL)
  526.         {
  527.             result = prefs.getBoolPref(prefName);
  528.         }
  529.  
  530.         return(result);
  531.     },
  532.  
  533.     ieargs: function()
  534.     {
  535.         return(this.getCharPref("ieview.ieargs", ""));
  536.     },
  537.  
  538.     getForceList: function()
  539.     {
  540.         var prefservice = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
  541.  
  542.         var prefs = prefservice.getBranch("");
  543.         var forces = new Array();
  544.  
  545.         if (prefs.getPrefType("ieview.forceielist") == prefs.PREF_STRING)
  546.         {
  547.             var forceList = this.deQuote(prefs.getCharPref("ieview.forceielist"));
  548.             forces = forceList.split(" ");
  549.  
  550.             var msg = "force list:\r\n";
  551.  
  552.             var i;
  553.  
  554.             for (i = 0; i < forces.length; ++i )
  555.             {
  556.                 msg += forces[i] + "\r\n";
  557.             }
  558.         }
  559.  
  560.         return(forces);
  561.     },
  562.  
  563.  
  564.     getTabUrl: function()
  565.     {
  566.         var result = null;
  567.  
  568.         if (gBrowser && gBrowser.mContextTab && gBrowser.getBrowserForTab(gBrowser.mContextTab))
  569.         {
  570.             result = gBrowser.getBrowserForTab(gBrowser.mContextTab).currentURI.spec;
  571.         }
  572.  
  573.         return(result);
  574.     },
  575.  
  576.     loadTabInIE: function(aEvent)
  577.     {
  578.         this.ieViewLaunch("Internet Explorer.lnk", this.getTabUrl());
  579.     },
  580.  
  581.     ieViewLaunch: function (path,argumentstext)
  582.     {
  583.         var cantMessage = "can't find";
  584.  
  585.         if (! this.isForceable(argumentstext))
  586.         {
  587.             return(false);
  588.         }
  589.  
  590.         try
  591.         {
  592.             cantMessage = gIeViewBundle.getString("ieview.cantFindExplorer");
  593.         }
  594.         catch(e)
  595.         {
  596.             alert(e);
  597.         }
  598.  
  599.         var prefservice = Components.classes["@mozilla.org/preferences-service;1"].
  600.                                 getService(Components.interfaces.nsIPrefService);
  601.  
  602.         var prefs = prefservice.getBranch("");
  603.  
  604.         try
  605.         {
  606.             if (path=="")
  607.                 return(false);
  608.  
  609.             var ieloc = null;
  610.  
  611.             if (prefs.getPrefType("ieview.ieapp") == prefs.PREF_STRING)
  612.             {
  613.                 ieloc = this.deQuote(prefs.getCharPref("ieview.ieapp"));
  614.  
  615.                 ieloc = this.expandEnv(ieloc);
  616.  
  617.                 if (this.trim(ieloc) == "")
  618.                 {
  619.                     ieloc = null;
  620.                 }
  621.             }
  622.  
  623.             var   natTarget = null;
  624.             var   usePath = null;
  625.  
  626.             if (ieloc != null)
  627.             {
  628.                 natTarget = ieloc;
  629.             }
  630.             else
  631.             {
  632.                 var dsprops = Components.classes['@mozilla.org/file/directory_service;1'].getService(Components.interfaces.nsIProperties);
  633.  
  634.                 usePath = this.tryDir(dsprops, this.userPrograms);    // try user-specific program menu first
  635.  
  636.                 var file = null;
  637.  
  638.                 if (usePath != "")
  639.                 {
  640.                     file = this.searchPath(usePath, path);
  641.                 }
  642.  
  643.                 if (! file)
  644.                 {
  645.                     usePath = this.tryDir(dsprops, this.allUserPrograms);   // no joy?  try "all users" program menu
  646.  
  647.                     if (usePath != "")
  648.                     {
  649.                         file = this.searchPath(usePath, path);
  650.                     }
  651.                 }
  652.  
  653.                 if (! file)
  654.                 {
  655.                     usePath = this.tryDir(dsprops, this.applicationData);   // last resort, check the "quick start" bar
  656.  
  657.                     if (usePath != "")
  658.                     {
  659.                         var   quickPath = "\\microsoft\\internet explorer\\quick launch";
  660.  
  661.                         usePath = usePath + quickPath;
  662.  
  663.                         file = this.searchPath(usePath, path);
  664.  
  665.                         if (! file)    // check alternate QuickLaunch bar title
  666.                         {
  667.                             var launchLink = "Launch Internet Explorer Browser.lnk";
  668.  
  669.                             file = this.searchPath(usePath, launchLink);
  670.                         }
  671.                     }
  672.                 }
  673.  
  674.                 // last ditch -- find the windows directory
  675.                 // assume that the main Program Files directory is on the same drive
  676.                 // look in there, under Program Files\Internet Explorer, for iexplore.exe
  677.                 //
  678.                 if (! file)
  679.                 {
  680.                     usePath = this.tryDir(dsprops, "WinD");
  681.  
  682.                     if ((usePath != "") && (usePath.charAt(1) == ":"))
  683.                     {
  684.                         usePath = usePath.substr(0, 2) + "\\program files\\internet explorer";
  685.  
  686.                         file = this.searchPath(usePath, "iexplore.exe");
  687.                     }
  688.                 }
  689.  
  690.                 if ((! file) || (! file.exists()))
  691.                 {
  692.                     alert(cantMessage);
  693.                     return false;
  694.                 }
  695.  
  696.                 natTarget = file.target;
  697.                 this.saveIeLoc(natTarget);
  698.             }
  699.  
  700.             var targetFile = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
  701.  
  702.             try
  703.             {
  704.                 targetFile.initWithPath(natTarget);
  705.             }
  706.             catch(e)
  707.             {
  708.                 alert(cantMessage);
  709.                 return(false);
  710.             }
  711.  
  712.             if (! targetFile.exists())
  713.             {
  714.                 alert(cantMessage);
  715.                 return(false);
  716.             }
  717.  
  718.             var process = Components.classes['@mozilla.org/process/util;1'].createInstance(Components.interfaces.nsIProcess);
  719.             process.init(targetFile);
  720.             var arguments= this.parseArgs(this.ieargs());
  721.  
  722.             arguments.push(argumentstext);
  723.  
  724.             process.run(false, arguments, arguments.length,{});
  725.             return true;
  726.  
  727.         }
  728.         catch (e)
  729.         {
  730.             alert(e);
  731.             return false;
  732.         }
  733.  
  734.         return false;     // avoid JavaScript Error.
  735.     },
  736.  
  737.  
  738.     ieviewInit: function()
  739.     {
  740.         var   i;
  741.  
  742.         gIeViewBundle = document.getElementById("bundle_ieview");
  743.  
  744.         var   docHref = this.getDocHref();
  745.  
  746.         if (docHref == "")
  747.         {
  748.             docHref = document.location.href;
  749.         }
  750.  
  751.         if (docHref.substring(0, 7) != 'chrome:')
  752.         {
  753.             if (! gIeViewBundle)
  754.             {
  755.                 return;
  756.             }
  757.         }
  758.  
  759.         if (typeof(getBrowser) != 'undefined')
  760.         {
  761.             var tabContextMenu = document.getAnonymousElementByAttribute(getBrowser(), "anonid", "tabContextMenu");
  762.     
  763.             if ((typeof(tabContextMenu) != 'undefined'))
  764.             {
  765.                 var ourContext = document.getElementById("context-ieViewTab");
  766.                 var ourSep = document.getElementById("context-ieViewTabsep");
  767.     
  768.                 var    loadBefore = null;
  769.     
  770.                 //    Find last menu sep, if any
  771.                 for ( var ii = 0; ii < tabContextMenu.childNodes.length; ++ii )
  772.                 {
  773.                     var item = tabContextMenu.childNodes[ii];
  774.     
  775.                     if (item.localName == "menuseparator")
  776.                     {
  777.                         loadBefore = item;
  778.                     }
  779.                 }
  780.     
  781.                 if (ourContext)
  782.                 {
  783.                     tabContextMenu.insertBefore(ourSep, loadBefore);
  784.                     tabContextMenu.insertBefore(ourContext, loadBefore);
  785.                 }
  786.     
  787.                 tabContextMenu.addEventListener("popupshowing", ieviewTabPopupShowing, false);
  788.             }
  789.         }
  790.  
  791.         var menu = document.getElementById("contentAreaContextMenu");
  792.         if (menu)
  793.         {
  794.             menu.addEventListener("popupshowing", ieviewContextListener,false);
  795.         }
  796.  
  797.         var appcontent = document.getElementById("appcontent");   // browser
  798.         if (appcontent)
  799.         {
  800.             appcontent.addEventListener("load", ieviewLoadListener, true);
  801.         }
  802.  
  803.         var ieviewPlacesContext = document.getElementById('placesContext');
  804.         if ((typeof(ieviewPlacesContext) != 'undefined') && ieviewPlacesContext)
  805.         {
  806.             ieviewPlacesContext.addEventListener('popupshowing', placesContextListener, false);
  807.             ieviewPlacesContext = null;
  808.         }
  809.  
  810.         if ((typeof(BookmarksEventHandler) != 'undefined') &&
  811.             (typeof(BookmarksEventHandler.onCommand) != 'undefined') &&
  812.             (typeof(BookmarksEventHandler.ievOnCommand) == 'undefined'))
  813.         {
  814.             BookmarksEventHandler.oldBmehOnCommand = BookmarksEventHandler.onCommand;
  815.  
  816.             BookmarksEventHandler.onCommand = function(bmocEvent) {
  817.                 var target = bmocEvent.originalTarget;
  818.  
  819.                 if (target.node && target.node.uri && IeView.forceIe(target.node.uri))
  820.                 {
  821.                     IeView.ieViewLaunch("Internet Explorer.lnk", target.node.uri);
  822.                     return;
  823.                 }
  824.  
  825.                 return( BookmarksEventHandler.oldBmehOnCommand(bmocEvent) );
  826.             };
  827.         }
  828.     },
  829.  
  830.     isForceable: function(href) 
  831.     {
  832.         return( (typeof(href) != 'undefined') && (href.substr) &&
  833.                     (this.startsWith(href, 'http://') ||
  834.                      this.startsWith(href, 'https://') ||
  835.                      this.startsWith(href, 'file://') ||
  836.                      this.startsWith(href, 'ftp://')
  837.                     )
  838.             );
  839.     },
  840.  
  841.     hideMenu: function(aEvent)
  842.     {
  843.         var i;
  844.         var doc = aEvent.originalTarget;
  845.  
  846.          var href = '';
  847.  
  848.         if (doc.location && doc.location.href)
  849.         {
  850.             href = doc.location.href;
  851.         }
  852.  
  853.         if (! href)
  854.         {
  855.             return;
  856.         }
  857.  
  858.         var menuitem = document.getElementById('ieview-do-forcepage-menu');
  859.  
  860.         if (! menuitem)
  861.         {
  862.             if (doc.getElementById)
  863.             {
  864.                 menuitem = doc.getElementById('ieview-do-forcepage-menu');
  865.             }
  866.         }
  867.  
  868.         if (! menuitem)
  869.         {
  870.             menuitem = document.getElementById('ieview-do-forcepage-menu-moz');
  871.         }
  872.  
  873.         if (! menuitem)
  874.         {
  875.             if (doc.getElementById)
  876.             {
  877.                 menuitem = doc.getElementById('ieview-do-forcepage-menu-moz');
  878.             }
  879.         }
  880.  
  881.         if (menuitem)      // click-on-page item
  882.         {
  883.             var enabled = this.enableForceIE() && this.isForceable(href);
  884.  
  885.             menuitem.setAttribute('disabled', enabled ? 'false' : 'true');
  886.         }
  887.  
  888.         var tbutton = document.getElementById("ieview-button");
  889.  
  890.         if (tbutton)
  891.         {
  892.             enabled = this.isForceable(href);
  893.             tbutton.setAttribute('disabled', enabled ? 'false' : 'true');
  894.             tbutton.disabled = ! enabled;
  895.         }
  896.     },
  897.  
  898.     grabLinks: function(aEvent)
  899.     {
  900.         var i;
  901.         var doc = aEvent.originalTarget;
  902.  
  903.         if ((! this.enableForceIE()) || (! doc) || (! doc.getElementsByTagName))
  904.         {
  905.             return;
  906.         }
  907.  
  908.         if (doc && doc.location && doc.location.href && (doc.location.href == "about:config"))
  909.         {
  910.             return;
  911.         }
  912.  
  913.         var links = doc.getElementsByTagName('a');
  914.  
  915.         for (i = 0; i < links.length; ++i)
  916.         {
  917.             var   ln = links[i];
  918.  
  919.             if (ln && ln.href && this.isForceable(ln.href))
  920.             {
  921.                 ln.addEventListener('click', this.ieviewClick, true);
  922.             }
  923.         }
  924.     },
  925.  
  926.     //    check whether the document behind a dom-loaded event is framed
  927.     //
  928.     isFramed: function(aEvent)
  929.     {
  930.         var cwin = aEvent.originalTarget.defaultView;
  931.         var framed = cwin &&  (cwin.parent != cwin) && (cwin.parent.frames.length > 0);
  932.  
  933.         return(framed);
  934.     },
  935.  
  936.     checkForced: function(aEvent)
  937.     {
  938.         var i;
  939.         var doc = aEvent.originalTarget;
  940.  
  941.         if (! this.enableForceIE())
  942.         {
  943.             return;
  944.         }
  945.  
  946.         // only want to reload the topmost frame
  947.         //
  948.         if (this.isFramed(aEvent))
  949.         {
  950.             return;
  951.         }
  952.  
  953.         if (doc.location && doc.location.href && this.forceIe(doc.location.href))
  954.         {
  955.             var ws = gBrowser.docShell.QueryInterface(Components.interfaces.nsIRefreshURI);
  956.  
  957.             if (ws)
  958.             {
  959.                 ws.cancelRefreshURITimers();
  960.             }
  961.  
  962.             doc.location.replace("chrome://ieview/content/reloaded.html");
  963.     
  964.             var head = null;
  965.     
  966.             var heads = doc.getElementsByTagName('head');
  967.     
  968.             if (heads && heads.length > 0)
  969.             {
  970.                 head = heads[0];
  971.             }
  972.             else
  973.             {
  974.                 heads = doc.getElementsByTagName('HEAD');
  975.  
  976.                 if (heads && heads.length > 0)
  977.                 {
  978.                     head = heads[0];
  979.                 }
  980.             }
  981.  
  982.             if (head)
  983.             {
  984.                 head.innerHTML = "<title>IE View " + gIeViewBundle.getString("ieview.reloaded") + "</title>";
  985.             }
  986.  
  987.             this.ieViewLaunch("Internet Explorer.lnk", doc.location.href);
  988.         }
  989.     },
  990.  
  991.     startsWith: function(st, pref)
  992.     {
  993.         return( (pref.length > 0) && (st.substring(0, pref.length) == pref) );
  994.  
  995.     },
  996.  
  997.     isMatch: function(url, pattern)
  998.     {
  999.         if ((pattern == null) || (pattern == ""))
  1000.         {
  1001.             return(false);
  1002.         }
  1003.  
  1004.         var     repat = pattern;
  1005.  
  1006.         repat = repat.replace(/\\/, "\\\\");
  1007.         repat = repat.replace(/\./g, "\\.");
  1008.         repat = repat.replace(/\?/g, "\\?");
  1009.         repat = repat.replace(/\//g, "\\/");
  1010.         repat = repat.replace(/\*/g, ".*");
  1011.         repat = repat.replace(/\{/g, "\\{");
  1012.         repat = repat.replace(/\}/g, "\\}");
  1013.         repat = repat.replace(/\.\*\\\./g, ".*\\.?\\b");
  1014.         repat = "^" + repat;
  1015.  
  1016.         var     reg = new RegExp(repat);
  1017.  
  1018.         var     matched = (reg.test(url));
  1019.  
  1020.         return(matched);
  1021.     },
  1022.  
  1023.     forceIe: function(href)
  1024.     {
  1025.         var skipList = this.getForceList();
  1026.  
  1027.         for (i = 0; i < skipList.length; ++i)
  1028.         {
  1029.             if (this.isMatch(href, skipList[i]))
  1030.             {
  1031.                 ieviewAlert(href + " matches " + skipList[i]);
  1032.                 return(true);
  1033.             }
  1034.         }
  1035.  
  1036.         return(false);
  1037.     },
  1038.  
  1039.     ieviewClick: function(aEvent)
  1040.     {
  1041.         var link = aEvent.originalTarget;
  1042.  
  1043.         if ((! link) || (! link.href))
  1044.         {
  1045.             link = aEvent.currentTarget;
  1046.         }
  1047.  
  1048.         if ((! link) || (! link.href))
  1049.         {
  1050.             return(true);
  1051.         }
  1052.  
  1053.         if (IeView.forceIe(link.href) ||
  1054.             (link.target && (link.target.toLowerCase() == "_blank_ie"))
  1055.            )
  1056.         {
  1057.             aEvent.preventDefault();
  1058.             IeView.ieViewLaunch("Internet Explorer.lnk", link.href);
  1059.             return(false);
  1060.         }
  1061.  
  1062.  
  1063.         return(true);
  1064.     },
  1065.  
  1066.     setIeviewOptions: function()
  1067.     {
  1068.         var prefService = Components.classes["@mozilla.org/preferences-service;1"]
  1069.                                     .getService(Components.interfaces.nsIPrefService);
  1070.  
  1071.         var prefs = prefService.getBranch("");
  1072.  
  1073.         prefs.setCharPref("ieview.ieapp", document.getElementById('ieloc').value);
  1074.         prefs.setCharPref("ieview.ieargs", document.getElementById('ieargs').value);
  1075.  
  1076.         prefs.setCharPref("ieview.forceielist", this.getPrefListString());
  1077.  
  1078.         var disableAlways = document.getElementById('disableAlways');
  1079.         var closeAfter = document.getElementById('closeAfterRedir');
  1080.     
  1081.         prefs.setBoolPref("ieview.disableForce", disableAlways.checked);
  1082.         prefs.setBoolPref("ieview.closeReloadPage", closeAfter.checked);
  1083.  
  1084.         window.close();
  1085.     },
  1086.  
  1087.     pickIe: function()
  1088.     {
  1089.         var picker = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
  1090.  
  1091.         picker.init(window, "Choose Browser", 0);
  1092.         picker.appendFilters(64);
  1093.  
  1094.         if (picker.show() == 0)
  1095.         {
  1096.             document.getElementById('ieloc').value = picker.file.target;
  1097.         }
  1098.     },
  1099.  
  1100.  
  1101.     initPath: function()
  1102.     {
  1103.         document.getElementById('ieloc').value = this.getCharPref("ieview.ieapp", "");
  1104.         document.getElementById('ieargs').value = this.getCharPref("ieview.ieargs", "");
  1105.  
  1106.         var skips = this.getForceList();
  1107.  
  1108.         var listbox = document.getElementById('patlist');
  1109.  
  1110.         if (! listbox)
  1111.         {
  1112.             alert('no listbox');
  1113.         }
  1114.         else
  1115.         {
  1116.             var i;
  1117.  
  1118.             for ( i = 0; i < skips.length; ++i )
  1119.             {
  1120.                 if (skips[i] != '')
  1121.                 {
  1122.                     listbox.appendItem(skips[i]);
  1123.                 }
  1124.             }
  1125.         }
  1126.  
  1127.         var np = document.getElementById('newpat');
  1128.  
  1129.         np.disabled = ! this.enableForceIE();
  1130.         listbox.disabled = ! this.enableForceIE();
  1131.  
  1132.         var disableAlways = document.getElementById('disableAlways');
  1133.         disableAlways.checked = ! this.enableForceIE();
  1134.     
  1135.         var closeAfter = document.getElementById('closeAfterRedir');
  1136.         closeAfter.checked = this.closeAfterRedirect();
  1137.     },
  1138.  
  1139.     updateDelButtonStatus: function()
  1140.     {
  1141.         var lb = document.getElementById('patlist');
  1142.         var bt = document.getElementById('delpat');
  1143.  
  1144.         bt.disabled = (lb.selectedItems.length < 1) || ! this.enableForceIE();
  1145.         this.updateEditButtonStatus();
  1146.     },
  1147.  
  1148.     compareNum: function(a,b)
  1149.     {
  1150.         return(b-a);
  1151.     },
  1152.  
  1153.     editSelected: function(editprompt)
  1154.     {
  1155.         this.updateEditButtonStatus();
  1156.  
  1157.         var bt = document.getElementById('editpat');
  1158.  
  1159.         if (bt.disabled)
  1160.         {
  1161.             return;
  1162.         }
  1163.  
  1164.         var lb = document.getElementById('patlist');
  1165.         var selected = lb.selectedItems;
  1166.  
  1167.         var idx = lb.getIndexOfItem(selected[0]);
  1168.  
  1169.         var oldtxt = selected[0].label;
  1170.     
  1171.         var newtext = prompt(editprompt, oldtxt);
  1172.         if (newtext)
  1173.         {
  1174.             lb.insertItemAt(idx, newtext);
  1175.             lb.removeItemAt(idx + 1);
  1176.             lb.selectedIndex = idx;
  1177.         }
  1178.  
  1179.         this.updateDelButtonStatus();
  1180.         this.updateEditButtonStatus();
  1181.     },
  1182.  
  1183.     deleteSelected: function()
  1184.     {
  1185.         var lb = document.getElementById('patlist');
  1186.         var selected = lb.selectedItems;
  1187.         var indexes = new Array();
  1188.  
  1189.         var i;
  1190.  
  1191.         for ( i  = 0; i < selected.length; ++i )
  1192.         {
  1193.             var item = selected[i];
  1194.  
  1195.             var idx = lb.getIndexOfItem(item);
  1196.  
  1197.             indexes[i] = idx;
  1198.         }
  1199.  
  1200.         indexes.sort(this.compareNum);
  1201.  
  1202.         for ( i = 0; i < indexes.length; ++i )
  1203.         {
  1204.             lb.removeItemAt(indexes[i]);
  1205.         }
  1206.  
  1207.         this.updateDelButtonStatus();
  1208.         this.updateEditButtonStatus();
  1209.     },
  1210.  
  1211.     updateEditButtonStatus: function() 
  1212.     {
  1213.         var lb = document.getElementById('patlist');
  1214.         var bt = document.getElementById('editpat');
  1215.  
  1216.         bt.disabled = (lb.selectedItems.length != 1) || ! this.enableForceIE();
  1217.     },
  1218.  
  1219.  
  1220.     updateButtonStatus: function()
  1221.     {
  1222.         var tb = document.getElementById('newpat');
  1223.         var bt = document.getElementById('addpat');
  1224.  
  1225.         bt.disabled = (this.trim(tb.value).length < 1);
  1226.     },
  1227.  
  1228.     addNewPat: function()
  1229.     {
  1230.         var tb = document.getElementById('newpat');
  1231.  
  1232.         var newstr = tb.value;
  1233.  
  1234.         if (newstr.indexOf("://") < 0)
  1235.         {
  1236.             newstr = "http://" + newstr;
  1237.         }
  1238.  
  1239.         var        listbox = document.getElementById('patlist');
  1240.  
  1241.         listbox.appendItem(this.trim(newstr));
  1242.  
  1243.         tb.value = "";
  1244.         this.updateButtonStatus();
  1245.         this.updateEditButtonStatus();
  1246.     },
  1247.  
  1248.     getPrefListString: function()
  1249.     {
  1250.         var result = "";
  1251.  
  1252.         var        listbox = document.getElementById('patlist');
  1253.         var rows = listbox.getRowCount();
  1254.         var i;
  1255.  
  1256.         for ( i = 0; i < rows; ++i )
  1257.         {
  1258.             var li = listbox.getItemAtIndex(i);
  1259.  
  1260.             if (result != "")
  1261.             {
  1262.                 result += " ";
  1263.             }
  1264.  
  1265.             result += li.label;
  1266.         }
  1267.  
  1268.         return(result);
  1269.     },
  1270.  
  1271.     trim: function(st)
  1272.     {
  1273.         var result = st;
  1274.  
  1275.         while ((result.length > 0) && (result.substring(0,1) == " "))
  1276.         {
  1277.             result = result.substring(1);
  1278.         }
  1279.  
  1280.         while ((result.length > 0) && (result.substring(st.length - 1, 1) == " "))
  1281.         {
  1282.             result = result.substring(0, result.length - 1);
  1283.         }
  1284.  
  1285.         return(result);
  1286.     },
  1287.  
  1288.     getDocHref: function()
  1289.     {
  1290.         if (typeof(XPCNativeWrapper) == "undefined")
  1291.         {
  1292.             return("");
  1293.         }
  1294.  
  1295.         var href = false;
  1296.         var locWrapper = false;
  1297.  
  1298.         try
  1299.         {
  1300.             var winWrapper = new XPCNativeWrapper(window._content, 'document');
  1301.             var docWrapper = new XPCNativeWrapper(winWrapper.document, 'location');
  1302.             locWrapper = new XPCNativeWrapper(docWrapper.location, 'href');
  1303.  
  1304.             href = locWrapper.href;
  1305.         }
  1306.         catch(e)
  1307.         {
  1308.             locWrapper = new XPCNativeWrapper(window, 'location', 'href');
  1309.             href = locWrapper.location.href;
  1310.         }
  1311.  
  1312.         return(href);
  1313.     }
  1314. };
  1315.  
  1316.  
  1317. function ieviewLaunchOptions()
  1318. {
  1319.     window.openDialog("chrome://ieview/content/ieviewsettings.xul", "ieviewsettings",
  1320.         "resizable,centerscreen,modal");
  1321. }
  1322.  
  1323. function ieviewContextListener(aEvent)
  1324. {
  1325.     return(IeView.ieviewContext(aEvent));
  1326. }
  1327.  
  1328. function placesContextListener(aEvent)
  1329. {
  1330.     return(IeView.placesContext(aEvent));
  1331. }
  1332.  
  1333. function ieviewLoadListener(aEvent)
  1334. {
  1335.     IeView.hideMenu(aEvent);
  1336.  
  1337.     return(IeView.grabLinks(aEvent));
  1338. }
  1339.  
  1340. function ieviewCheckForcedListener(aEvent)
  1341. {
  1342.     IeView.checkForced(aEvent);
  1343. }
  1344.  
  1345. function ieviewInitListener(aEvent)
  1346. {
  1347.     return(IeView.ieviewInit(aEvent));
  1348. }
  1349.  
  1350. function ieviewTabPopupShowing(aEvent)
  1351. {
  1352.     return(IeView.tabContextShowing(aEvent));
  1353. }
  1354.  
  1355. // do the init on load
  1356.  
  1357. var initWith = window;
  1358.  
  1359. initWith.addEventListener("load", ieviewInitListener, false);
  1360.  
  1361. window.addEventListener("DOMContentLoaded", ieviewCheckForcedListener, false);
  1362.  
  1363. if (typeof(BookmarksCommand) != "undefined")
  1364. {
  1365.     if (BookmarksCommand.openOneBookmark && (! BookmarksCommand.oldOpenOneBookmark) && IeView.enableForceIE())
  1366.     {
  1367.         BookmarksCommand.oldOpenOneBookmark = BookmarksCommand.openOneBookmark;
  1368.  
  1369.         BookmarksCommand.openOneBookmark = function(aURI, aTargetBrowser, aDS) {
  1370.  
  1371.             var namespaceVar = null;
  1372.  
  1373.             if (typeof(gNC_NS) != "undefined")
  1374.             {
  1375.                 namespaceVar = gNC_NS;
  1376.             }
  1377.             else if (typeof(NC_NS) != "undefined")
  1378.             {
  1379.                 namespaceVar = NC_NS;
  1380.             }
  1381.             else
  1382.             {
  1383.                 alert('no namespace var');
  1384.             }
  1385.  
  1386.             var url = BookmarksUtils.getProperty(aURI, namespaceVar+"URL", aDS);
  1387.  
  1388.             if (IeView.forceIe(url))
  1389.             {
  1390.                 IeView.ieViewLaunch("Internet Explorer.lnk", url);
  1391.                 return;
  1392.             }
  1393.             else
  1394.             {
  1395.                 BookmarksCommand.oldOpenOneBookmark(aURI, aTargetBrowser, aDS);
  1396.             }
  1397.         };
  1398.     }
  1399. }
  1400.